home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / language / nasm20 / nasm20s.zoo / lexer.c < prev    next >
C/C++ Source or Header  |  1993-01-22  |  34KB  |  1,273 lines

  1. /* ---------------------------------------------------------------------- */
  2. /*                   Copyright (C) 1991 by Natürlich!                     */
  3. /*                      This file is copyrighted!                         */
  4. /*                Refer to the documentation for details.                 */
  5. /* ---------------------------------------------------------------------- */
  6. #define DEBUG     0
  7. #define TOKDEBUG  0            /* following set 4 Atari 8MHz */
  8. #define FINPUT_IO 1            /* yields 15% speed increase  */
  9. #define QINPUT_IO 1            /* yields 20% speed increase  */
  10. #define USEINLINE 0
  11. #define QSTRING   0            /* 1 == doesn't do much       */
  12. #define QWHITE    1
  13. #define QCOMMENT  1
  14. #define QIDENT    1
  15. #define QIDENT2   0            /* 1 == worsens performance ! */
  16. #define QLABEL    0            /* 1 == doesn't do anything   */
  17. #define QMACRO    0            /* 1 == same or worse         */
  18. #define QDIRECT   0            /* 1 == doesn't do anything   */
  19.  
  20. /* --------------------------------------------------------- */
  21. /*    SHIT!! FLEX can't digest characters >= 128             */
  22. /*    Now I have to write my own lexer...                    */
  23. /* --------------------------------------------------------- */
  24. #include "defines.h"
  25. #include "nasm.h"
  26. #include "y_tab.h"
  27. #include <stdio.h>
  28. #if OS == TOS
  29. #include <osbind.h>
  30. #endif
  31. #include <setjmp.h>
  32.  
  33. #include "debug.h"
  34. #include "code.h"
  35. #include NMALLOC_H
  36. #if VERSION && FINPUT_IO
  37. extern buffer huge   *bp;
  38. # include "inputfst.h"
  39. #endif
  40.  
  41. #define LINESTART       0
  42. #define INSTRUCTION     1
  43. #define AFTERINSTR      2
  44. #define AFTERELSE       3
  45. #define AFTEROPTION     4
  46. #define AFTERFLOAT      5
  47. #define AFTERINCLUDE    6
  48. #define COMMENT         7
  49.  
  50. #define E_GARBAGE    garbage        /* historic */
  51. #define E_LABELFORM  labelform
  52. #define E_HEXLEN     hexlen
  53. #define E_INTSIZE    intsize
  54.  
  55. static char
  56.    igarbage[] =  "Garbage in the instruction field",
  57.    garbage[]  =  "Totally uncomprehendable garbage",
  58.    labelform[] = "Label starts off with wrong character",
  59.    hexlen[] =  "Hex value exceeds 16 Bit (not that good on a 64K machine)",
  60.    intsize[] = "Integer value >= 65536, how would that fit into 2 bytes ?",
  61.    mpara_incomplete[] = 
  62.                 "Incomplete macro parameter (form %[$]<[0-9]+|(<label>))";
  63.  
  64. /* --------------------------------------------------------- */
  65. /* The ultra-clever (har har) way of deciding whether we are */
  66. /* facing something usable as an identifier character.       */
  67. /* There is a method to this madness:                        */
  68. /*   Bit7 . Bit6 . Bit5 . Bit4 . Bit3 . Bit2 . Bit1 . Bit0   */
  69. /*   -----+------+------+------+------+------+------+-----   */
  70. /*   Lower|      |      | Foo  | A-Z  |Float | Hex  | No     */
  71. /*   -----+------+------+------+------+------+------+-----   */
  72. /*    $80   $40    $20    $10    $08    $04    $02    $01    */
  73. /*                                                           */
  74. /*    A question remains, are we losing with this table ??   */
  75. /* --------------------------------------------------------- */
  76. #define is_ident( c)    (is_what[ (c)])
  77. #define is_lower( c)    ((signed char) is_what[ (c)] < 0)
  78. #define is_hex( c)      (is_what[ (c)] & M_HEX)
  79. #define is_digit( c)    (is_what[ (c)] == DIGIT)
  80. #define is_letter( c)   (is_what[ (c)] & M_LETTER)
  81. #define is_float( c)    (is_what[ (c)] & M_FLOAT)
  82.  
  83. #define tis_ident( c)   (p_table[ (c)])
  84. #define tis_lower( c)   ((signed char) p_table[ (c)] < 0)
  85. #define tis_hex( c)     (p_table[ (c)] & M_HEX)
  86. #define tis_digit( c)   (p_table[ (c)] == DIGIT)
  87. #define tis_letter( c)  (p_table[ (c)] & M_LETTER)
  88. #define tis_float( c)   (p_table[ (c)] & M_FLOAT)
  89.  
  90. #define M_LOWER   0x80
  91. #define M_FOO     0x10
  92. #define M_LETTER  0x08
  93. #define M_FLOAT   0x04
  94. #define M_HEX     0x02
  95. #define M_DIGIT   0x01
  96.  
  97. #define DIGIT     (M_DIGIT  | M_HEX | M_FLOAT)
  98. #define L         (M_LETTER | M_LOWER)           /* lower  */
  99. #define A          M_LETTER                      /* upper  */
  100. #define H         (M_LETTER | M_HEX)             /* up&hex */
  101. #define E         (M_LETTER | M_HEX | M_FLOAT)
  102. #define P                             M_FLOAT
  103. #define X          M_FOO
  104. #define N          DIGIT
  105.  
  106.  
  107. byte is_what[] =                          /* xlat:  is' watt !?!? */
  108. {
  109.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $00 */
  110.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $10 */
  111.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,P,0, /* $20 */
  112.    N,N,N,N,  N,N,N,N,  N,N,X,0,  0,0,0,X, /* $30 */
  113.  
  114.    X,H,H,H,  H,E,H,A,  A,A,A,A,  A,A,A,A, /* $40 */
  115.    A,A,A,A,  A,A,A,A,  A,A,A,0,  0,0,0,X, /* $50 */
  116.    0,L,L,L,  L,L,L,L,  L,L,L,L,  L,L,L,L, /* $60 */
  117.    L,L,L,L,  L,L,L,L,  L,L,L,0,  0,0,0,0, /* $70 */
  118.  
  119.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $80 */
  120.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $90 */
  121.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $A0 */
  122.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $B0 */
  123.  
  124.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $C0 */
  125.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $D0 */
  126.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $E0 */
  127.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0  /* $F0 */
  128. };
  129.  
  130. #undef F
  131. #undef N
  132. #undef L
  133. #undef A
  134. #undef H
  135. #undef E
  136. #undef P
  137. #undef X
  138.  
  139.  
  140. #define is_white( c)    (white[ (c)])
  141. #define skip_white(c)   while( white[ c]) c = uinput()
  142. #define tis_white( c)   (p_table[ (c)])
  143. #define tskip_white(c)  while( p_table[ c]) c = uinput()
  144.  
  145. static char white[] =         /* ain't no saying whether this actually */
  146. {                             /* helps improve the speed               */
  147.    0,0,0,0,  0,0,0,0,  0,1,0,0,  0,1,0,0, /* $00 */
  148.    0,0,0,0,  0,0,0,0,  0,0,1,0,  0,0,0,0, /* $10 */   /* $1A for MSDOS */
  149.    1,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $20 */   /* whatever that */
  150.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $30 */   /* might be      */
  151.  
  152.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $40 */
  153.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $50 */
  154.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $60 */
  155.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $70 */
  156.  
  157.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $80 */
  158.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $90 */
  159.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $A0 */
  160.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $B0 */
  161.  
  162.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $C0 */
  163.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $D0 */
  164.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $E0 */
  165.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0  /* $F0 */
  166. };
  167.  
  168. #define A   0x01   /* 'X'  */
  169. #define B   0x02   /* 'Y'  */
  170.  
  171. #define C   0x03   /* '#'  */
  172.  
  173. #define D   0x04   /* '('  */
  174. #define E   0x05   /* ')'  */
  175. #define F   0x06   /* ','  */
  176. #define G   0x07   /* '='  */
  177. #define H   0x08   /* '+'  */
  178. #define I   0x09   /* '-'  */
  179. #define J   0x0A   /* '!'  */
  180. #define K   0x0B   /* '&'  */
  181. #define L   0x0C   /* '*'  */
  182. #define M   0x0D   /* '/'  */
  183. #define N   0x0E   /* '\\' */
  184. #define O   0x0F   /* '^'  */
  185. #define P   0x10   /* '['  */
  186. #define Q   0x11   /* ']'  */
  187. #define IREGS  0x02
  188.  
  189. static byte af1_toks[] =
  190. {
  191.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $00 */
  192.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $10 */
  193.    0,J,0,C,  0,0,K,0,  D,E,L,H,  F,I,0,M, /* $20 */
  194.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,G,0,0, /* $30 */
  195.  
  196.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $40 */
  197.    0,0,0,0,  0,0,0,0,  A,B,0,P,  N,Q,O,0, /* $50 */
  198.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $60 */
  199.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $70 */
  200.  
  201.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $80 */
  202.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $90 */
  203.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $A0 */
  204.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $B0 */
  205.  
  206.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $C0 */
  207.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $D0 */
  208.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $E0 */
  209.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0  /* $F0 */
  210. };
  211.  
  212. static byte af2_toks[] =
  213. {
  214.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $00 */
  215.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $10 */
  216.    0,J,0,0,  0,0,K,0,  D,E,L,H,  F,I,0,M, /* $20 */
  217.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,G,0,0, /* $30 */
  218.  
  219.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,0,0, /* $40 */
  220.    0,0,0,0,  0,0,0,0,  0,0,0,P,  N,Q,O,0, /* $50 */
  221.    0,0,0,0,  0,0,0,0,  0,0,0,0,  0,0,